package com;

import java.util.ArrayList;

import com.Exception.NotExistingException;

/**
 * Type définit une liste sans doublons de type de constantes
 * @author florent
 */
public class Type {
	
	private String name = null; //nom du type
	
	private static ArrayList<Type> EXISTING_TYPES = new ArrayList<Type>(); //liste statisque sans doublons de types
	
	/**
	 * Créé un type en fonction de son nom
	 * @param name
	 */
	private Type(String name){
		this.name = name;
	}
	
	/**
	 * Retourne le nom du type
	 * @return le nom du type
	 */
	public String getName(){
		return name;
	}
	
	public String toString(){
		return name;
	}
	
	/**
	 * Méthode statique permettant de créer un type en évitant des doublons
	 * @param name nom du type
	 * @return le type créé/ ou récuperé
	 */
	public static Type newType(String name){
		boolean exists = false;
		
		name = name.replace(" ", "");
		
		Type type = null;
		
		for(Type t : EXISTING_TYPES){
			if(t.name.equals(name)){
				exists = true;
				type = t;
				break;
			}
		}
		if(exists == false){ //si non trouvé
			type = new Type(name);
			EXISTING_TYPES.add(type);
		}
		
		return type;
	}
	
	/**
	 * Retourne le type dont le nom est passé en paramètre
	 * @param name nom tu type recherché
	 * @return le type
	 * @throws NotExistingException si le type n'existe pas
	 */
	public static Type getType(String name) throws NotExistingException{
		for(Type t : EXISTING_TYPES){
			if(t.name == name)
				return t;
		}
		throw new NotExistingException("Type innexistante");
	}
	
	/**
	 * Retourne la liste de tout les types existants
	 * @return la liste de tout les types existants
	 */
	public static ArrayList<Type> getTypes(){
		return EXISTING_TYPES;
	}
	
}
